home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / plotting / contour / contour.lha / Contour / IOread.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-08-28  |  11.8 KB  |  375 lines

  1. /*** IOread.c - read input etc ***/
  2.  
  3. #include <stdio.h>
  4. #include <strings.h>
  5. #include "common.h"
  6. #include "contour.h"
  7. #include "plot.h"
  8. #include "Xdefs.h"
  9.  
  10. /* Read the command line */
  11. fileopen(argc,argv) 
  12. int argc;
  13. char **argv;
  14.    FILE   *fp,*optionfile, *fopen();
  15.    double atof();
  16.    extern char   printer[MAXCHAR];
  17.    extern int    cont_out, expand, grid, postscript, oldformat, contlabel;
  18.    extern int    joincurve, printplot;
  19.    extern char   *joinlevel;
  20.    extern double cont_level;
  21.    int    i,FILEFOUND;
  22.  
  23.    /* initialize general X arguments */
  24.    progname     = argv[0];
  25.    font_name    = NULL;
  26.    geometry     = NULL;
  27.    display_name = NULL;
  28.    border_color = NULL;
  29.    fore_color   = NULL;
  30.    back_color   = NULL;
  31.    mouse_color  = NULL;
  32.    icon_color   = NULL;
  33.    reverse      = 0;
  34.    border_width = 0;
  35.  
  36.    FILEFOUND = FALSE;
  37.    for (i=1; i < argc; i++) {                     /* Parse Line */
  38.       if (argv[i][0] == '=') {
  39.          geometry = argv[i];
  40.          continue;
  41.          }
  42.       if (strncmp(argv[i],"-geom",5)==0) {        /* new geometry */
  43.          if (++i >= argc) usage(progname);
  44.          geometry = argv[i];
  45.          continue;
  46.          }
  47.       if (index(argv[i],':')!=NULL) {             /* host:display */
  48.          strncpy(display_name,argv[i],sizeof(display_name));
  49.          continue;
  50.          }
  51.       if (!strncmp(argv[i],"-d",2)) {             /* new display */
  52.          if (++i >= argc) usage(progname);
  53.          display_name = argv[i];
  54.          continue;
  55.          }
  56.       if (strcmp(argv[i],"-rv") == 0) {           /* reverse display */
  57.          reverse = 1;
  58.          continue;
  59.          }
  60.       if (strcmp(argv[i],"-bw") == 0) {           /* border width */
  61.          if (++i >= argc) usage(progname);
  62.          border_width = atoi(argv[i]);
  63.          continue;
  64.          }
  65.       if (strcmp(argv[i],"-bd") == 0) {           /* border color */
  66.          if (++i >= argc) usage(progname);
  67.          border_color = argv[i];
  68.          continue;
  69.          }
  70.       if (strcmp(argv[i],"-fg") == 0) {           /* foreground color */
  71.          if (++i >= argc) usage(progname);
  72.          fore_color = argv[i];
  73.          continue;
  74.          }
  75.       if (strcmp(argv[i],"-bg") == 0) {           /* background color */
  76.          if (++i >= argc) usage(progname);
  77.          back_color = argv[i];
  78.          continue;
  79.          }
  80.       if (strcmp(argv[i],"-fn") == 0) {           /* font type */
  81.          if (++i >= argc) usage(progname);
  82.          font_name  = argv[i];
  83.          continue;
  84.          }
  85.       if (strcmp(argv[i],"-c") == 0) {            /* output contour */  
  86.          if (++i >= argc) usage(progname);
  87.          cont_level = atof(argv[i]);
  88.          cont_out   = ON;
  89.          continue;
  90.          }
  91.       if (strcmp(argv[i],"-e") == 0) {            /* expand into 3D */
  92.          expand = ON;
  93.          fprintf(stdout,"   Commands: expand (3D)     = ON\n");
  94.          continue;
  95.          }
  96.       if (strcmp(argv[i],"-j") == 0) {            /* join curves */
  97.          if (++i >= argc) usage(progname);
  98.          joincurve = ON;
  99.          joinlevel = argv[i];
  100.          if ((strcmp(joinlevel,"HIGH")==0)||(strcmp(joinlevel,"high")==0)||
  101.              (strcmp(joinlevel,"LOW" )==0)||(strcmp(joinlevel,"low" )==0)) {
  102.             fprintf(stdout,"   Commands: joincurve       = ON\n");
  103.             fprintf(stdout,"   Commands: joinlevel       = %s\n",joinlevel);
  104.          } else {
  105.             fprintf(stdout,"   Warning : Invalid keyword -");
  106.             fprintf(stdout," [-j] option only accepts [HIGH/LOW]\n");
  107.             joinlevel = OFF;
  108.          }
  109.          continue;
  110.          }
  111.       if (strcmp(argv[i],"-g") == 0) {            /* grid */
  112.          grid = ON;
  113.          fprintf(stdout,"   Commands: grid            = ON\n");
  114.          continue;
  115.          }
  116.       if (strcmp(argv[i],"-l") == 0) {            /* label */
  117.          contlabel = OFF;
  118.          fprintf(stdout,"   Commands: contlabel       = OFF\n");
  119.          continue;
  120.          }
  121.       if (strcmp(argv[i],"-print") == 0) {        /* printplot */
  122.          printplot  = ON;
  123.          fprintf(stdout,"   Commands: printplot       = ON\n");
  124.          continue;
  125.          }
  126.       if (strcmp(argv[i],"-ps") == 0) {           /* postscript */
  127.          postscript = OFF;
  128.          fprintf(stdout,"   Commands: postscript      = OFF\n");
  129.          continue;
  130.          }
  131.       if (strcmp(argv[i],"-old") == 0) {          /* old format */
  132.          oldformat = ON;
  133.          fprintf(stdout,"   Commands: oldformat       = ON\n");
  134.          continue;
  135.          }
  136.       if (strcmp(argv[i],"-s") == 0) {            /* scale factor */  
  137.          if (++i >= argc) usage(progname);
  138.          scale = atof(argv[i]);
  139.          if (scale < 0.1 || scale > 1) {
  140.             scale = 1.0;
  141.             fprintf(stdout,"   Warning : Invalid scale -");
  142.             fprintf(stdout," scale reset to %f\n",scale);
  143.          }
  144.          fprintf(stdout,"   Commands: scale           = %f\n",scale);
  145.          continue;
  146.          }
  147.       if (strcmp(argv[i],"-o") == 0) {            /* options file */
  148.          if (++i >= argc) usage(progname);
  149.          if ((optionfile =  fopen(argv[i],"r")) == NULL) {
  150.             fprintf(stderr,"cat: can't open %s\n", argv[i]);
  151.             usage(progname);
  152.          } else {
  153.             fprintf(stdout,"   Commands: options-file    = \"%s\"\n",argv[i]);
  154.             parse(optionfile);
  155.             fclose(optionfile);
  156.          }
  157.          continue;
  158.          }
  159.       if (argv[i][0] == '-' && argv[i][1] == 'P') {     /* Printer */
  160.          strcpy(printer,argv[i]); 
  161.          fprintf(stdout,"   Commands: Printer         = %s\n",printer);
  162.          continue;
  163.          }
  164.       if (argv[i][0] == '-') usage(progname);
  165.       if (argv[i][0] != '-' && argv[i][0] != '=') {
  166.          FILEFOUND = TRUE;
  167.          if ((fp = fopen(argv[i], "r")) == NULL) {
  168.             fprintf(stderr,"cat: can't open %s\n", argv[i]);
  169.             exit(1);
  170.          } else {
  171.             imagefile = argv[i];
  172.             fileread(fp);
  173.             fclose(fp);
  174.          }
  175.          }
  176.    }
  177.    if (FILEFOUND == FALSE) usage(progname);
  178.    /* exit(0); */
  179. }
  180.  
  181. /* read in the data */
  182. fileread(fp)
  183. FILE *fp;
  184. {
  185.    float    rdfloat();
  186.    triaptr  insert_tria();
  187.    data     *create_data_array();
  188.    data     get_data_array_value();
  189.    void     free_data_array();
  190.    extern   int     joincurve;
  191.    extern   char    *joinlevel;
  192.    extern   double  xmin, xmax, ymin, ymax, zmin, zmax;
  193.    extern   int     oldformat;
  194.    double   x0,xl,y0,yl,z,delta,ztarget;
  195.    data     *datapt, midpt, pt00, pt01, pt10, pt11;
  196.    int      i,j,nx,ny,isize,jsize; 
  197.  
  198.    zmin = LARGE;
  199.    zmax = -LARGE;
  200.  
  201.    if (!oldformat) {
  202.       /* read the number of x and y points */
  203.       xmin = rdfloat(fp);
  204.       xmax = rdfloat(fp);
  205.       ymin = rdfloat(fp);
  206.       ymax = rdfloat(fp);
  207.       xl   = xmax - xmin;
  208.       yl   = ymax - ymin;
  209.       nx   = (int)rdfloat(fp);
  210.       ny   = (int)rdfloat(fp);
  211.    } else {
  212.       /* old contour format from SPLAT - assume 50 x 50 data */
  213.       x0   = rdfloat(fp);
  214.       y0   = rdfloat(fp);
  215.       xl   = rdfloat(fp);    
  216.       yl   = rdfloat(fp);    
  217.       xmin = x0;
  218.       xmax = x0+xl;
  219.       ymin = y0;
  220.       ymax = y0+yl;
  221.       nx   = 50;
  222.       ny   = 50;
  223.    }
  224.  
  225.    if ((nx < 0) || (ny < 0)) {
  226.       fprintf(stderr,"No of array gridpoints is less than 0 : ");
  227.       fprintf(stderr,"nx=%d ny=%d\n",nx,ny);
  228.       exit(1);
  229.    }
  230.    /* create the new array */
  231.    isize = nx;
  232.    jsize = ny;
  233.    if (joincurve) {
  234.       isize = nx + 2;
  235.       jsize = ny + 2;
  236.    }
  237.    datapt = create_data_array(isize,jsize);
  238.  
  239.    if (joincurve == OFF) {
  240.       /* read the intensity values next */
  241.       /* data goes from i=0 to i=npts-1 */
  242.       for (j=0; j<ny; j++)
  243.       for (i=0; i<nx; i++) {
  244.          z = rdfloat(fp);   
  245.          if (z < zmin) zmin = z;
  246.          if (z > zmax) zmax = z;
  247.          midpt.x = xmin + i*xl/(double)(nx-1);
  248.          midpt.y = ymin + j*yl/(double)(ny-1);
  249.          midpt.z = z;
  250.          assign_data_array_value(datapt,i,j,isize,jsize,&midpt);
  251.       }
  252.       /* now put the values into triangles */
  253.       for (i=0; i<nx-1; i++)
  254.       for (j=0; j<ny-1; j++) {
  255.          pt00 = get_data_array_value(datapt,i  ,j  ,isize,jsize);
  256.          pt10 = get_data_array_value(datapt,i+1,j  ,isize,jsize);
  257.          pt01 = get_data_array_value(datapt,i  ,j+1,isize,jsize);
  258.          pt11 = get_data_array_value(datapt,i+1,j+1,isize,jsize);
  259.          midpt.x = 0.5*(pt00.x + pt10.x);
  260.          midpt.y = 0.5*(pt00.y + pt01.y);
  261.          midpt.z = 0.25*(pt00.z + pt01.z +
  262.                          pt10.z + pt11.z);
  263.          insert_tria(&(pt00),&(pt10),&midpt);
  264.          insert_tria(&(pt10),&(pt11),&midpt);
  265.          insert_tria(&(pt11),&(pt01),&midpt);
  266.          insert_tria(&(pt01),&(pt00),&midpt);
  267.       }
  268.    } else {
  269.       if (xl > yl) delta = 1.0e-4 * yl;
  270.       else         delta = 1.0e-4 * xl;
  271.       /* read the intensity values next */
  272.       /* data goes from i=1 to i=npts   */
  273.       for (j=1; j<=ny; j++)
  274.       for (i=1; i<=nx; i++) {
  275.          z = rdfloat(fp);   
  276.          if (z < zmin) zmin = z;
  277.          if (z > zmax) zmax = z;
  278.          midpt.x = xmin + (i-1)*xl/(double)(nx-1);
  279.          midpt.y = ymin + (j-1)*yl/(double)(ny-1);
  280.          midpt.z = z;
  281.          assign_data_array_value(datapt,i,j,isize,jsize,&midpt);
  282.       }
  283.       if ((strcmp(joinlevel,"HIGH")==0)||(strcmp(joinlevel,"high")==0))
  284.          ztarget = zmax;
  285.       else
  286.          ztarget = zmin;
  287.       /* now fill up a boundary layer, i=0, i=npts+1 */
  288.       for (i=0; i<=nx+1; i++) {
  289.          j=0;
  290.          midpt.x = xmin + (i-1)*xl/(double)(nx-1);
  291.          if (i==0   ) midpt.x = xmin - delta;
  292.          if (i==nx+1) midpt.x = xmax + delta;
  293.          midpt.y = ymin - delta;
  294.          midpt.z = ztarget;
  295.          assign_data_array_value(datapt,i,j,isize,jsize,&midpt);
  296.          j=ny+1;
  297.          midpt.x = xmin + (i-1)*xl/(double)(nx-1);
  298.          if (i==0   ) midpt.x = xmin - delta;
  299.          if (i==nx+1) midpt.x = xmax + delta;
  300.          midpt.y = ymax + delta;
  301.          midpt.z = ztarget;
  302.          assign_data_array_value(datapt,i,j,isize,jsize,&midpt);
  303.       }
  304.       for (j=0; j<=ny+1; j++) {
  305.          i=0;
  306.          midpt.x = xmin - delta;
  307.          midpt.y = ymin + (j-1)*yl/(double)(ny-1);
  308.          if (j==0   ) midpt.y = ymin - delta;
  309.          if (j==ny+1) midpt.y = ymax + delta;
  310.          midpt.z = ztarget;
  311.          assign_data_array_value(datapt,i,j,isize,jsize,&midpt);
  312.          i=nx+1;
  313.          midpt.x = xmax + delta;
  314.          midpt.y = ymin + (j-1)*yl/(double)(ny-1);
  315.          if (j==0   ) midpt.y = ymin - delta;
  316.          if (j==ny+1) midpt.y = ymax + delta;
  317.          midpt.z = ztarget;
  318.          assign_data_array_value(datapt,i,j,isize,jsize,&midpt);
  319.       }
  320.  
  321.       /* now put the values into triangles */
  322.       for (i=0; i<nx+1; i++)
  323.       for (j=0; j<ny+1; j++) {
  324.          pt00 = get_data_array_value(datapt,i  ,j  ,isize,jsize);
  325.          pt10 = get_data_array_value(datapt,i+1,j  ,isize,jsize);
  326.          pt01 = get_data_array_value(datapt,i  ,j+1,isize,jsize);
  327.          pt11 = get_data_array_value(datapt,i+1,j+1,isize,jsize);
  328.          midpt.x = 0.5*(pt00.x + pt10.x);
  329.          midpt.y = 0.5*(pt00.y + pt01.y);
  330.          midpt.z = 0.25*(pt00.z + pt01.z +
  331.                          pt10.z + pt11.z);
  332.          insert_tria(&(pt00),&(pt10),&midpt);
  333.          insert_tria(&(pt10),&(pt11),&midpt);
  334.          insert_tria(&(pt11),&(pt01),&midpt);
  335.          insert_tria(&(pt01),&(pt00),&midpt);
  336.       }
  337.    }
  338.  
  339.    /* now free the array */
  340.    free_data_array(datapt);
  341. }
  342.  
  343. /* Read a float; skip the whole line if failed */
  344. float rdfloat(fp)
  345. FILE *fp;
  346. {
  347.    int n;
  348.    char c;
  349.    float x;
  350.  
  351.    /* try to read a floating variable */
  352.    /* if fail, then skip the whole line */
  353.    while ( (n=fscanf(fp,"%f",&x)) != EOF && n!=1) {
  354.       if (n!=1)
  355.          while ( (c=getc(fp)) != EOF && c != '\n');
  356.       }
  357.  
  358.    if (n==EOF) {
  359.       fprintf(stderr,"Error: Incorrect Format!\n");
  360.       exit(1);
  361.    }
  362.    return(x);
  363. }
  364.  
  365. /* the options */
  366. usage (program)
  367. char *program;
  368. {
  369.       fprintf(stderr,"usage: %s [-o options_file] [-Pprinter] \
  370. [-s scale] [-c level] [-e] [-g] [-j joinlevel] [-l] \
  371. [-print] [-ps] [-old] contour_file\n",program);
  372.       exit(1);
  373. }
  374.